package com.hello.system.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 微信内容安全服务
 * 
 * @author hello
 */
@Service
@Slf4j
public class WxContentSecurityService {

    @Value("${wx.miniapp.appid}")
    private String appId;
    
    @Value("${wx.miniapp.secret}")
    private String secret;
    
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 检测文本内容是否安全
     * 
     * @param content 需要检测的文本内容
     * @param openid 用户的openid，可为null（使用系统默认值）
     * @return Map 包含检测结果，其中 pass 字段表示是否通过检测
     */
    public Map<String, Object> checkText(String content, String openid) {
        Map<String, Object> result = new HashMap<>();
        result.put("pass", false);
        
        if (content == null || content.isEmpty()) {
            result.put("message", "内容不能为空");
            return result;
        }
        
        try {
            log.info("开始进行文本内容安全识别, content长度: {}, openid: {}", content.length(), openid);
            
            // 1. 获取access_token
            String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
            ResponseEntity<Map> tokenResponse = restTemplate.getForEntity(tokenUrl, Map.class);
            Map<String, Object> tokenBody = tokenResponse.getBody();
            
            if (tokenBody == null || !tokenBody.containsKey("access_token")) {
                log.error("获取access_token失败: {}", tokenBody);
                result.put("message", "获取access_token失败");
                return result;
            }
            
            String accessToken = (String) tokenBody.get("access_token");
            
            // 2. 调用内容安全接口 (使用v2版本)
            String url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken;
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            
            // 构建v2版本所需的请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("content", content);
            requestBody.put("version", 2);  // 使用v2版本
            requestBody.put("scene", 1);    // 场景值：1-资料，2-评论，3-论坛，4-社交日志
            
            // 如果提供了openid则使用，否则使用系统值
            if (openid != null && !openid.isEmpty()) {
                requestBody.put("openid", openid);
            } else {
                requestBody.put("openid", "system_content_check");  // 使用系统默认值
            }
            
            HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
            ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, Map.class);
            Map<String, Object> responseBody = response.getBody();
            
            if (responseBody == null) {
                result.put("message", "未收到检测响应");
                return result;
            }
            
            log.info("文本内容安全识别完成, 响应结果: {}", responseBody);
            
            Integer errcode = (Integer) responseBody.getOrDefault("errcode", -1);
            result.put("rawResponse", responseBody);
            
            if (errcode != null && errcode == 0) {
                // 检查详细结果 - v2版本会在result中返回更详细的信息
                Map<String, Object> wxResult = (Map<String, Object>) responseBody.getOrDefault("result", new HashMap<>());
                String suggest = (String) wxResult.getOrDefault("suggest", "");
                Integer label = (Integer) wxResult.getOrDefault("label", 0);
                
                // 记录详细信息
                List<Map<String, Object>> detail = (List<Map<String, Object>>) responseBody.getOrDefault("detail", new ArrayList<>());
                if (detail != null && !detail.isEmpty()) {
                    for (Map<String, Object> item : detail) {
                        log.info("检测策略: {}, 建议: {}, 标签: {}", 
                                item.getOrDefault("strategy", ""),
                                item.getOrDefault("suggest", ""),
                                item.getOrDefault("label", 0));
                    }
                }
                
                // 根据suggest字段判断是否通过检查
                if ("pass".equals(suggest)) {
                    // 确认无违规内容
                    result.put("pass", true);
                    result.put("message", "内容安全");
                } else if ("risky".equals(suggest)) {
                    // 确认有违规内容
                    result.put("message", "内容包含敏感信息");
                    result.put("label", label);
                } else if ("review".equals(suggest)) {
                    // 可疑内容，建议人工复核
                    result.put("message", "内容可能存在问题，需要人工审核");
                    result.put("label", label);
                } else {
                    // 默认情况，如果没有明确的suggest，通过label判断
                    if (label != null && label != 100) {  // 100表示正常文本
                        result.put("message", "内容可能存在敏感信息 (标签:" + label + ")");
                        result.put("label", label);
                    } else {
                        result.put("pass", true);
                        result.put("message", "内容安全");
                    }
                }
            } else if (errcode != null && errcode == 87014) {
                // 老版本的错误码，仍然处理
                result.put("message", "内容包含敏感信息 (错误码:87014)");
            } else {
                result.put("message", "检测失败: " + responseBody.getOrDefault("errmsg", "未知错误"));
            }
            
        } catch (Exception e) {
            log.error("文本内容安全识别失败", e);
            result.put("message", "内容检测出错: " + e.getMessage());
        }
        
        return result;
    }
    
    /**
     * 检查内容是否合规，不合规则抛出异常
     * 
     * @param content 需要检测的内容
     * @param openid 用户的openid，可为null
     * @throws RuntimeException 如果内容不合规
     */
    public void checkTextAndThrow(String content, String openid) {
        Map<String, Object> result = checkText(content, openid);
        
        if (!(Boolean) result.get("pass")) {
            throw new RuntimeException("内容安全检测未通过: " + result.get("message"));
        }
    }
} 